package meta

import (
	mydb "filestore-server/db"
)

// 文件的 Sha1 值，是文件的唯一标识，也可以用 md5
// FileMeta 定义文件的元信息
type FileMeta struct {
	FileSha1 string // 文件 Sha1 值
	FileName string // 文件名称
	FileSize int64  // 文件大小
	Location string // 文件路径
	UploadAt string // 文件时间戳
}

// 文件元信息可能存在多个
var fileMetas map[string]FileMeta

// 会在程序启动的时候执行
// init 初始化信息
func init()  {
	fileMetas = make(map[string]FileMeta)
}

// UpdateFileMeta 新增/更新 文件的 Meta 信息
func UpdateFileMeta(fmeta FileMeta) {
	fileMetas[fmeta.FileSha1] = fmeta
}

// UpdateFileMeta 新增/更新 文件的 Meta 信息 入库到MySQL
func UpdateFileMetaDB(fmeta FileMeta) bool {
	return mydb.OnFileUploadFinished(fmeta.FileSha1,fmeta.FileName,fmeta.FileSize, fmeta.Location)
}

// GetFileMeta 根据 fileSha1 获取文件元信息
func GetFileMeta(fileSha1 string) FileMeta {
	return fileMetas[fileSha1]
}

// GetFileMetaDB 根据 fileSha1 数据库获取文件元信息
func GetFileMetaDB(fileSha1 string) (*FileMeta, error) {
	tfile, err := mydb.GetFileMeta(fileSha1)
	if err != nil {
		return nil, err
	}

	fmeta := &FileMeta{
		FileSha1: tfile.FileHash,
		FileName: tfile.FileName.String,
		FileSize: tfile.FileSize.Int64,
		Location: tfile.FileAddr.String,
	}

	return fmeta, nil
}

// GetLastFileMeta 获取批量的文件信息列表
func GetLastFileMeta(count int) []FileMeta {
	// 创建一个 []FileMeta数组
	fMetaArray := make([]FileMeta, len(fileMetas))
	for _, item:= range fileMetas {
		fMetaArray = append(fMetaArray, item)
	}

	// 可以做个排序

	return fMetaArray

}

// RemoveFileMeta 删除操作
func RemoveFileMeta(fileSha1 string) {

	// 这里还可以做删除的一些判断操作

	delete(fileMetas, fileSha1)
}
